package com.dongdongshop.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dongdong.Cart;
import com.dongdong.pojo.TbItem;
import com.dongdong.pojo.TbOrderItem;
import com.dongdong.pojo.User;
import com.dongdong.pojo.UserExample;
import com.dongdong.service.ItemService;
import com.dongdong.service.UserService;
import com.dongdongshop.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
@com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Reference
    private ItemService itemService;

    @Autowired
    private RedisTemplate redisTemplate;

//    从redis查询购物车数据
    @Override
    public List<Cart> getCartList(String username) {
        List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps("cartList").get(username);
        if(cartList == null){
            cartList = new ArrayList<>();
        }
        return cartList;
    }

//   向redis 中储存 购物车数据
    @Override
    public void saveCartList(List<Cart> cartList1, String username) {
        redisTemplate.boundHashOps("cartList").put(username,cartList1);
    }

    @Override
    public User selectNmae(String username) {
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        criteria.andUnameEqualTo(username);
        List<User> users = userMapper.selectByExample(example);
        if(users == null || users.size() <= 0){
            return null;
        }
        return users.get(0);
    }

    @Override
    public List<Cart> save(List<Cart> cartList, Long itemId, Integer num) {

//        1. 根据it|emid 查询出sku的详情信息
        TbItem item = itemService.selectById(itemId);
//        2. 从sku中获取 商家ID
        String sellerId = item.getSellerId();
//        3. 判断原购物车中有没有这个商家的购物车
        Cart cart = getCaetBySellerId(cartList, sellerId);
//        3.1 如果没有新增一个购物车 然后将数据放进去  最后新增的这个数据追加到原来的购物列表中
            if(cart == null){
//                3.1.1  新增购物车
                cart = new Cart();
                cart.setSellerId(sellerId);
//                3.1.2 将要买的商品 放置到 明细列表中
                TbOrderItem orderItem = createOrderItem(item, num);
//                总价
                orderItem.setTotalFee(new BigDecimal(num * item.getPrice().doubleValue()));
//                3.1.3创建明细列表并将购物车明细数据放置到明细列表中
                List<TbOrderItem> orderItemList = new ArrayList<>();
                orderItemList.add(orderItem);
//                3.1.4 将购物车明细列表放置到购物车里
                cart.setOrderItemList(orderItemList);
//                 3.1.5  将新购物车和老的购物车放在一起
                cartList.add(cart);
            }else {//        3.2 如果原来的购物车中有原来商家购物车
//        3.2.1 判断这个商家的购物车明细中是否有当前要买的商品   如果没有 新增一个明细追加到这个商家的明细列表中

                TbOrderItem tbOrderItem = getOrderItem(cart.getOrderItemList(), itemId);
//                如果没有新增一个明细增加到这个明细列表中
                if(tbOrderItem == null){
                    TbOrderItem orderItem = createOrderItem(item, num);
                    cart.getOrderItemList().add(orderItem);
                }else {
                    tbOrderItem.setNum(tbOrderItem.getNum() + num);
                    tbOrderItem.setTotalFee(new BigDecimal(tbOrderItem.getPrice().doubleValue() * tbOrderItem.getNum()));
                    //        3.2.2 如果有这件商品  我们只需要修改其数量和小计
                    if(tbOrderItem.getNum().intValue() <= 0){
                        cart.getOrderItemList().remove(tbOrderItem);
                    }
                    if(cart.getOrderItemList().size() <= 0){
                        cartList.remove(cart);
                    }
//                    如果当前购物车明细列表已经没有数据了  我们将当前购物车从  购物车列表中移除

                }
            }
//        4 返回数据
        return cartList;
    }



//    判断购物车集合中是否存在该商家的购物车   如果存在就返回商家的购物车  如果不存在就返回null
//                                          原来的购物车      商家Id
    private Cart getCaetBySellerId(List<Cart> cartList,String sellerId){
        return cartList.stream().filter(cart -> Objects.equals(cart.getSellerId(), sellerId)).findFirst().orElse(null);
    }


//    判断购物车明细中是否有该商品   如果存在就返回该商品  如果不存在  就返回null
    private TbOrderItem getOrderItem(List<TbOrderItem> orderItemList,Long itemId){
        return orderItemList.stream().filter(item -> Objects.equals(item.getItemId(), itemId)).findFirst().orElse(null);
    }


//    组装购物车明细
    private TbOrderItem createOrderItem(TbItem item,Integer num){
        TbOrderItem tborderItem = new TbOrderItem();
        tborderItem.setSellerId(item.getSellerId());
        tborderItem.setNum(num);
        tborderItem.setItemId(item.getId());
        tborderItem.setGoodsId(item.getGoodsId());
        tborderItem.setTitle(item.getTitle());
        tborderItem.setPrice(item.getPrice());
        tborderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue()* num));
        tborderItem.setPicPath(item.getImage());
        return tborderItem;
    }


//    合并redis和cookie中的购物车
    @Override
    public List<Cart> merageCartList(List<Cart> cartRedisList, List<Cart> cartCookiteList) {
        for (Cart cart : cartCookiteList) {
            for (TbOrderItem orderItem : cart.getOrderItemList()) {
                cartRedisList = save(cartRedisList,orderItem.getItemId(),orderItem.getNum());
            }
        }
        return cartRedisList;
    }
}
